Skip to main content

04.Bash Function

Table of Contents

函数定义

functionName() {
code
}

function functionName() {
code
}

function functionName {
code
}

函数调用

function hello() {                               # 定义函数
local name=$1 # 获取第一个参数的值赋值给 name(使用 local 声明局部变量, 避免污染全局变量)
echo "Function hello $name"
}

$ hello "lily" # 函数调用
> Function hello lily # 函数执行结果

函数允许使用参数, 参数使用 $1$2$3 等获取
$0 表示函数名
$# 表示参数个数
$* 表示所有参数
$@ 表示所有参数

function func() {                               # 在 test.sh 中定义函数
for param in $*; do
echo "param $param"
done
echo "param length: $#"
echo "full param: $@"
}
func 1st 2nd 3rd # 函数调用

$ bash test.sh # 执行脚本
> param 1st
> param 2nd
> param 3rd
> param length: 3
> full param: 1st 2nd 3rd

函数返回

使用 return 返回函数值, 返回值只能是数字(0-255)
一般使用 0 表示执行成功, 1 或其它非 0 数字表示执行失败

function bigger() {                              # 定义函数
[[ $1 -gt $2 ]] && return 0 || return 1 # 返回值只允许数字
}

$ num1=7; num2=3; bigger num1 num2 # 变量定义, 函数调用
$ [[ $? -eq 0 ]] && echo "$num1 bigger" || echo "$num2 bigger"
> 7 bigger

获取函数打印作为返回值

function add() {
echo $(($1 + $2))
}

echo "100 + 200 = $(add 100 200)"

function last_user() {
who | awk '{print $1}' | tail -n 1
}

echo "last user: $(last_user)"

变量作用域

定义的变量默认为全局变量, 使用 local 定义为局部变量 为避免使用全局变量污染(同名覆盖), 函数内变量使用局域变量

count=0                                          # 定义全局变量 count
function func() {
local index=0 # 定义局内变量 index
for param in $*; do
count=$((count + 1))
index=$(expr $index + 1)
done
echo "local count: $count index: $index" # 函数内打印
}

func 1st 2nd 3rd # 函数调用
echo "global count: $count index: $index" # 函数调用
echo "param: $param"

$ bash test.sh # 执行脚本
> local count: 3 index: 3 # 函数内部全局变量和局部变量都可用
> global count: 3 index: # 函数外局部变量不可用
> param: 3rd # 函数内部变量污染全局变量